package com.config;


import com.fallback.*;
import com.hmall.common.utils.UserContext;
import feign.Logger;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;

/**
 * DefaultFeign类用于定义Feign客户端的回退机制
 * 在Feign客户端调用失败时，提供一个回退实现，以保证系统的健壮性和稳定性
 */
public class DefaultFeign {

    /**
     * 创建一个PayClientFallback实例作为Bean
     * 当Feign客户端调用失败时，PayClientFallback将作为回退实现
     *
     * @return PayClientFallback的实例
     */
    @Bean
    public PayClientFallback payClientFallback() {
        return new PayClientFallback();
    }


    /**
     * 创建一个ItemClientFallback实例作为Bean
     * 当Feign客户端调用失败时，ItemClientFallback将作为回退实现
     *
     * @return ItemClientFallback的实例
     */
    @Bean
    /**
     * 创建一个ItemClientFallback的实例并返回
     * 用于在Item服务调用失败时提供回退逻辑
     *
     * @return ItemClientFallback实例
     */
    public ItemClientFallback itemClientFallback() {
        return new ItemClientFallback();
    }

    @Bean
    /**
     * 创建一个CartClientFallback的实例并返回
     * 用于在Cart服务调用失败时提供回退逻辑
     *
     * @return CartClientFallback实例
     */
    public CartClientFallback cartClientFallback() {
        return new CartClientFallback();
    }

    @Bean
    /**
     * 创建一个TradeClientFallback的实例并返回
     * 用于在Trade服务调用失败时提供回退逻辑
     *
     * @return TradeClientFallback实例
     */
    public TradeClientFallback tradeClientFallback() {
        return new TradeClientFallback();
    }

    @Bean
    /**
     * 创建一个UserClientFallback的实例并返回
     * 用于在User服务调用失败时提供回退逻辑
     *
     * @return UserClientFallback实例
     */
    public UserClientFallback userClientFallback() {
        return new UserClientFallback();
    }

    //注册一个feign日志记录级别: none->basic->headers->full
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;//全部记录
    }
    //feign请求拦截器
    @Bean
    public RequestInterceptor feignRequestInterceptor() {
        return template -> {
            //获取线程变量中的用户id
            Long userId = UserContext.getUser();
            //判断用户id是否存在
            if (userId != null) {
                //设置请求头
                template.header("user-info", userId.toString());
            }
        };

    }
}
